1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
// app/api/document-reviews/[id]/route.ts
import { NextRequest, NextResponse } from "next/server"
import db from "@/db/db"
import { rfqLastTbeDocumentReviews } from "@/db/schema"
import { eq } from "drizzle-orm"
import { getServerSession } from "next-auth"
import { authOptions } from "@/app/api/auth/[...nextauth]/route"
import { revalidateTag } from "next/cache"
// PATCH - 문서 리뷰 업데이트
export async function PATCH(
request: NextRequest,
{ params }: { params: { id: string } }
) {
try {
const session = await getServerSession(authOptions)
if (!session?.user) {
return NextResponse.json({ error: "인증이 필요합니다." }, { status: 401 })
}
const reviewId = parseInt(params.id)
if (!reviewId) {
return NextResponse.json({ error: "Invalid review ID" }, { status: 400 })
}
const body = await request.json()
const { reviewStatus, reviewComments } = body
// 현재 문서 리뷰 조회
const [currentReview] = await db
.select()
.from(rfqLastTbeDocumentReviews)
.where(eq(rfqLastTbeDocumentReviews.id, reviewId))
.limit(1)
if (!currentReview) {
return NextResponse.json({ error: "Review not found" }, { status: 404 })
}
// 권한 체크 - 구매자만 리뷰 가능 (또는 admin)
const userId = typeof session.user.id === 'string' ? parseInt(session.user.id) : session.user.id
const isAdmin = (session.user as any).roles?.includes('admin') || false
// 여기서는 구매자 권한 체크를 간단히 처리
// 실제로는 세션의 role이나 type을 확인해야 함
// 업데이트할 데이터 준비
const updateData: any = {
updatedAt: new Date()
}
if (reviewStatus !== undefined) {
updateData.reviewStatus = reviewStatus
}
if (reviewComments !== undefined) {
updateData.reviewComments = reviewComments
}
// 리뷰 상태가 변경되면 관련 필드도 업데이트
if (reviewStatus && reviewStatus !== currentReview.reviewStatus) {
updateData.reviewedBy = userId
updateData.reviewedAt = new Date()
// 상태에 따른 추가 필드 설정
switch (reviewStatus) {
case "승인":
updateData.technicalCompliance = true
updateData.qualityAcceptable = true
updateData.requiresRevision = false
break
case "반려":
updateData.technicalCompliance = false
updateData.qualityAcceptable = false
updateData.requiresRevision = true
break
case "보류":
updateData.requiresRevision = true
break
}
}
// 업데이트 실행
const [updated] = await db
.update(rfqLastTbeDocumentReviews)
.set(updateData)
.where(eq(rfqLastTbeDocumentReviews.id, reviewId))
.returning()
// 캐시 초기화
if (currentReview.tbeSessionId) {
revalidateTag(`tbe-session-${currentReview.tbeSessionId}`)
}
return NextResponse.json(updated)
} catch (error) {
console.error("Failed to update document review:", error)
return NextResponse.json({
error: "Failed to update document review"
}, { status: 500 })
}
}
// GET - 문서 리뷰 조회
export async function GET(
request: NextRequest,
{ params }: { params: { id: string } }
) {
try {
const session = await getServerSession(authOptions)
if (!session?.user) {
return NextResponse.json({ error: "인증이 필요합니다." }, { status: 401 })
}
const reviewId = parseInt(params.id)
if (!reviewId) {
return NextResponse.json({ error: "Invalid review ID" }, { status: 400 })
}
const [review] = await db
.select()
.from(rfqLastTbeDocumentReviews)
.where(eq(rfqLastTbeDocumentReviews.id, reviewId))
.limit(1)
if (!review) {
return NextResponse.json({ error: "Review not found" }, { status: 404 })
}
return NextResponse.json(review)
} catch (error) {
console.error("Failed to fetch document review:", error)
return NextResponse.json({
error: "Failed to fetch document review"
}, { status: 500 })
}
}
|